import os
import hashlib
import shutil

"""
您的下载文件夹是否杂乱无章？您是否在最需要重要文件时手忙脚乱地寻找它们？您是否尝试过无数次整理文件夹，但都以失败告终？

此自动化脚本可帮助您在几分钟内整理文件夹。您只需指定要清理的路径，此脚本就会根据文件扩展名自动将所有文件划分到不同的文件夹中。

这还不是全部！！它还可以通过比较文件的哈希值来检测和处理重复文件。
"""

import hashlib
import os
import shutil


def get_file_hash(file_path):
    """
    计算文件的SHA256哈希值。

    参数:
    file_path (str): 文件的路径。

    返回:
    str: 文件内容的SHA256哈希值的十六进制表示。
    """
    with open(file_path, 'rb') as f:
        return hashlib.sha256(f.read()).hexdigest()


def organize_and_move_duplicates(folder_path):
    """
    组织并移动指定文件夹中的文件，将重复文件移至'Duplicates'子文件夹，
    同类型的文件移动到相应扩展名的文件夹中。

    参数:
    folder_path (str): 需要组织的文件夹路径。
    """
    # 创建一个字典，用于根据文件扩展名存储目标文件夹路径
    extension_folders = {}

    # 创建或确认'重复'文件夹存在
    duplicates_folder = os.path.join(folder_path, '重复')
    os.makedirs(duplicates_folder, exist_ok=True)

    # 创建一个字典，用于存储文件的哈希值
    file_hashes = {}

    # 遍历文件夹中的所有文件
    for filename in os.listdir(folder_path):
        file_path = os.path.join(folder_path, filename)
        if os.path.isfile(file_path):
            # 获取文件的扩展名
            _, extension = os.path.splitext(filename)
            extension = extension.lower()  # 转换为小写以统一处理

            # 确定文件的目标文件夹
            if extension in extension_folders:
                destination_folder = extension_folders[extension]
            else:
                # 创建针对该扩展名的新文件夹
                destination_folder = os.path.join(folder_path,
                                                  extension[1:])  # Remove the leading dot from the extension
                os.makedirs(destination_folder, exist_ok=True)
                # 记录该扩展名对应的文件夹路径
                extension_folders[extension] = destination_folder

            # 计算文件的哈希值
            file_hash = get_file_hash(file_path)

            # 检查文件是否重复
            if file_hash in file_hashes:
                # 移动重复文件到'Duplicates'文件夹
                shutil.move(file_path, os.path.join(duplicates_folder, filename))
                print(f"移动重复文件 {filename} 到 重复 文件夹..")
            else:
                # 记录该哈希值的文件名
                file_hashes[file_hash] = filename
                # 移动文件到其相应的文件夹
                shutil.move(file_path, destination_folder)
                print(f"移动文件 {filename} 到 {destination_folder}")


if __name__ == "__main__":
    folder_path = "../"
    organize_and_move_duplicates(folder_path)
